/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package kitaplaner.application;

import java.sql.Connection;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.Locale;
import javax.swing.tree.DefaultMutableTreeNode;
import kitaplaner.database.Database;
import kitaplaner.database.Fehltag;
import kitaplaner.database.Kita;
import kitaplaner.database.Urlaubstage;

/**
 *
 * @author yves
 */
public class UrlaubstageApp {
    Kita kita = new Kita();
    Database db = new Database();
    MitarbeiterApp mApp;
    Connection conn;

    public UrlaubstageApp(Kita kita, Connection conn)
    {
        this.conn = conn;
        this.kita = kita;
        this.mApp = new MitarbeiterApp(kita, conn);
        
    }
    
    public boolean insertUrlaubstag(int mitarbeiterID, Date urlaubsDatum)
    {
        Urlaubstage urlaubstag = new Urlaubstage();
        
        urlaubstag.setMaId(mitarbeiterID);
        urlaubstag.setDatum(urlaubsDatum);
        if (urlaubstag.save(urlaubstag)) {
            return true;
        }else
        {
            return false;
        }
    }
    
    public Object [] createComboBoxTextByMa(int mitarbeiterID)
    {
        Object [] comboItems;

        ArrayList <Fehltag> utListe = kita.getFehltage();
        ArrayList utListeMitarbeiter = new ArrayList();

        for (int i = 0; i < utListe.size(); i++)
        {
            if (utListe.get(i).getMaId() == mitarbeiterID && utListe.get(i).getFehlgrund().equals("Urlaub"))
            {
                utListeMitarbeiter.add(utListe.get(i).getDatum());
            }
        }
        
        comboItems = utListeMitarbeiter.toArray();

        return comboItems;
    }

    public ArrayList<Urlaubstage> getUrlaubstageMitarbeiter(int mitarbeiterID) 
    {
        ArrayList<Urlaubstage> all = db.getUrlaubstage(conn);
        ArrayList<Urlaubstage> result = new ArrayList();
        
        for (int i = 0; i < all.size(); i++) {
            if (all.get(i).getMaId() == mitarbeiterID) {
                result.add(all.get(i));
            }
        }
        
        return result;
    }

    public javax.swing.JTree createTreeView(ArrayList<Fehltag> urlaubstage) {

        // create root, branches and leafs
        DefaultMutableTreeNode urlaubstageRoot = new DefaultMutableTreeNode("Jahr");
        DefaultMutableTreeNode monthBranch = new DefaultMutableTreeNode("Monate! - Branch");
        DefaultMutableTreeNode dayLeafs = new DefaultMutableTreeNode("Tage! - Leaf");
        
        String month = null;
        String day = null;
        Boolean branchExists = false;
        
        Calendar calendar = new GregorianCalendar();
        Urlaubstage urlaubstag = new Urlaubstage();
        Date date = null;
        // get data and grow tree

        Iterator it = urlaubstage.iterator();
        
        while (it.hasNext()) {
            urlaubstag = (Urlaubstage) it.next();
            date = (Date) urlaubstag.getDatum();
            calendar.setTime(date);

            month = calendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.GERMAN);
            day = calendar.get(Calendar.DAY_OF_MONTH)+ " " + calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.GERMAN);
            //System.out.println(day + month);
            
            // 1. Baum ist Leer
            if (urlaubstageRoot.children() == null) {
                // Füge monat und tag knoten ein
                monthBranch = new DefaultMutableTreeNode(month);
                dayLeafs = new DefaultMutableTreeNode(day);

                monthBranch.add(dayLeafs);
                urlaubstageRoot.add(monthBranch);
            } else {
                // 2. Baum ist nicht leer, suche nach vorhanden monatsknoten
                Enumeration childrenOfRoot = urlaubstageRoot.children();
                while (childrenOfRoot.hasMoreElements()) {
                    monthBranch = (DefaultMutableTreeNode) childrenOfRoot.nextElement();
                    
                    // monatsknoten gefunden
                    if (monthBranch.getUserObject().toString().equals(month)) {
                        dayLeafs = new DefaultMutableTreeNode(day);
                        monthBranch.add(dayLeafs);
                        
                        branchExists = true;
                    }else
                    {
                        branchExists = false;
                    }

                }
                // 3. Baum ist nicht leer, und Monat ist bereits vorhanden
                if (!branchExists) {
                    monthBranch = new DefaultMutableTreeNode(month);
                    dayLeafs = new DefaultMutableTreeNode(day);

                    monthBranch.add(dayLeafs);
                    urlaubstageRoot.add(monthBranch);
                }
            }
        }
        javax.swing.JTree tree = new javax.swing.JTree(urlaubstageRoot);
        tree.setRootVisible(false);
        return tree;
    }

    public Boolean deleteUrlaubsTag(int mitarbeiterID, Date dateToDelete) {
        ArrayList <Urlaubstage> urlaubstage = kita.getUrlaub();
        int id = -1;
        for (int i = 0; i < urlaubstage.size(); i ++)
        {
            if (urlaubstage.get(i).getDatum() == dateToDelete && urlaubstage.get(i).getMaId() == mitarbeiterID)
            {
                id = urlaubstage.get(i).getId();
                urlaubstage.remove(i);
            }
        }

        conn = db.checkConnection(conn);
        Boolean success = db.deleteUrlaubstag(conn, id);
        kita.setUrlaub(urlaubstage);

        return success;
    }
}
